#include <iostream>
using namespace std;

template <typename T>
T my_sum(T x, T y){
    cout << "模板函数" << endl;
    return x + y;
}

// 模板函数也支持重载
template <typename T>
T my_sum(T x, T y, T z){
    return x + y + z;
}

// 且模板函数和普通函数也构成重载关系
int my_sum(int x, int y){
    cout << "普通函数" << endl;
    return x + y;
}

int main(int argc, const char *argv[]){
    // 给类型传参才是模板函数的常规调用方式
    // 尽量不要依赖编译器的自动推导 因为编译器的版本不同结果可能不一致
    cout << my_sum<int>(10, 20) << endl; // 30
    cout << my_sum<double>(10.1, 20.2) << endl; // 30.3

    cout << my_sum<int>(10, 20, 30) << endl; // 60
    cout << my_sum<double>(10.1, 20.2, 30.3) << endl; // 60.6

    cout << "--------------" << endl;
    // 编译器自动推导时 如果有普通函数 优先调用普通函数
    // 如果没有普通函数 也可以调用模板函数
    cout << my_sum(100, 200) << endl; // 300

    cout << "--------------" << endl;
    // 也可以用下面的用法来指定本地调用模板函数
    // 不写类型时 类型 是自动推导的
    cout << my_sum<>(100, 200) << endl; // 300

    return 0;
}